{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 🍳 Recipe Chef Assistant with AI + MCP\n",
    "\n",
    "Build your own culinary companion that:\n",
    "1. 🔍 Researches recipes from cooking websites\n",
    "2. 🧠 Remembers your dietary preferences and restrictions\n",
    "3. 💡 Suggests recipes based on what you have\n",
    "\n",
    "## How This Works\n",
    "\n",
    "When you pass MCP tools to aisuite:\n",
    "1. **aisuite handles the glue work** - converts MCP tool specs to the format your LLM needs (OpenAI, Anthropic, etc.)\n",
    "2. **Automatic execution** - when the LLM requests a tool, aisuite calls the MCP server and returns results\n",
    "3. **You just write natural prompts** - no need to worry about tool schemas or execution logic!\n",
    "\n",
    "This is the power of aisuite + MCP: unified tool calling across any LLM provider.\n",
    "\n",
    "**What you need:**\n",
    "- Anthropic API key (add to `.env` file)\n",
    "- Python with `uv` installed (for fetch MCP server)\n",
    "- Node.js/npx installed (for memory MCP server)\n",
    "\n",
    "**Installation:**\n",
    "```bash\n",
    "pip install aisuite python-dotenv\n",
    "pip install 'aisuite[mcp]'  # Includes MCP client + nest_asyncio for Jupyter support\n",
    "pip install uv  # For fetch MCP server\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "✓ Ready to cook up some recipes!\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import sys\n",
    "from pathlib import Path\n",
    "\n",
    "# Add parent directory to path for development\n",
    "# Skip this step if you're running from an installed package\n",
    "repo_root = Path().absolute().parent.parent\n",
    "if str(repo_root) not in sys.path:\n",
    "    sys.path.insert(0, str(repo_root))\n",
    "\n",
    "from dotenv import load_dotenv\n",
    "from aisuite import Client\n",
    "from aisuite.mcp import MCPClient\n",
    "\n",
    "load_dotenv()\n",
    "\n",
    "# Verify API key\n",
    "if not os.getenv(\"ANTHROPIC_API_KEY\"):\n",
    "  raise ValueError(\"❌ Add ANTHROPIC_API_KEY to .env file!\")\n",
    "\n",
    "print(\"✓ Ready to cook up some recipes!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 1: Set Up Your Chef Assistant\n",
    "\n",
    "We'll give the AI two tools:\n",
    "- **Fetch**: Get recipes from cooking websites\n",
    "- **Memory**: Remember your preferences, restrictions, and favorite recipes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "🔍 Fetch server ready - can research recipes from the web\n",
      "🧠 Memory server ready - will remember your preferences\n",
      "📁 Recipes stored in: /Users/rohit/fleet/leclerc/aisuite-prs/aisuite-main/aisuite/examples/agents/recipe_memory.jsonl\n"
     ]
    }
   ],
   "source": [
    "# Set up memory file for your cooking preferences\n",
    "memory_file = os.path.join(os.getcwd(), \"recipe_memory.jsonl\")\n",
    "\n",
    "# Start fetch server (for getting recipes from the web)\n",
    "fetch_mcp = MCPClient(\n",
    "    command=\"uvx\",\n",
    "    args=[\"mcp-server-fetch\"],\n",
    "    name=\"fetch\"\n",
    ")\n",
    "\n",
    "# Start memory server (for remembering preferences and recipes)\n",
    "memory_mcp = MCPClient(\n",
    "    command=\"npx\",\n",
    "    args=[\"-y\", \"@modelcontextprotocol/server-memory\"],\n",
    "    env={\"MEMORY_FILE_PATH\": memory_file},\n",
    "    name=\"memory\"\n",
    ")\n",
    "\n",
    "print(\"🔍 Fetch server ready - can research recipes from the web\")\n",
    "print(\"🧠 Memory server ready - will remember your preferences\")\n",
    "print(f\"📁 Recipes stored in: {memory_file}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2: Set Up Your Dietary Profile\n",
    "\n",
    "Let's tell the assistant about your dietary preferences and restrictions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "============================================================\n",
      "👤 YOUR COOKING PROFILE\n",
      "============================================================\n",
      "Perfect! I've stored your dietary profile. Here's a summary:\n",
      "\n",
      "## Your Dietary Profile\n",
      "\n",
      "**🥗 Diet Type:** Vegetarian (no meat, fish, or poultry)\n",
      "\n",
      "**🍽️ Cuisine Preferences:**\n",
      "- Italian cuisine\n",
      "- Thai cuisine\n",
      "\n",
      "**⚠️ Dietary Restrictions:**\n",
      "- **Shellfish allergy** - must be completely avoided\n",
      "- **Lactose intolerant** - dairy alternatives should be used\n",
      "\n",
      "**❤️ Favorite Dishes:**\n",
      "- Pasta dishes\n",
      "- Stir-fries\n",
      "- Curries\n",
      "\n",
      "**👨‍🍳 Cooking Style:**\n",
      "- Skill level: Intermediate\n",
      "- Time preference: Quick meals (under 30 minutes)\n",
      "\n",
      "Your profile is now saved, and I can use this information to provide personalized recipe suggestions and cooking advice that fits your preferences, restrictions, and lifestyle!\n"
     ]
    }
   ],
   "source": [
    "client = Client()\n",
    "\n",
    "# Combine tools from both servers\n",
    "all_tools = fetch_mcp.get_callable_tools() + memory_mcp.get_callable_tools()\n",
    "\n",
    "response = client.chat.completions.create(\n",
    "    model=\"anthropic:claude-sonnet-4-5\",\n",
    "    messages=[{\n",
    "        \"role\": \"user\",\n",
    "        \"content\": \"\"\"Store my dietary profile in memory:\n",
    "        \n",
    "        **Preferences:**\n",
    "        - I'm vegetarian (no meat, fish, or poultry)\n",
    "        - I love Italian and Thai cuisine\n",
    "        - I prefer quick meals (under 30 minutes)\n",
    "        - I'm intermediate skill level\n",
    "        \n",
    "        **Restrictions:**\n",
    "        - No shellfish (allergy)\n",
    "        - Lactose intolerant (use dairy alternatives when possible)\n",
    "        \n",
    "        **Favorites:**\n",
    "        - Pasta dishes\n",
    "        - Stir-fries\n",
    "        - Curries\n",
    "        \n",
    "        Then summarize my profile back to me!\"\"\"\n",
    "    }],\n",
    "    tools=memory_mcp.get_callable_tools(),\n",
    "    max_turns=5\n",
    ")\n",
    "\n",
    "print(\"=\"*60)\n",
    "print(\"👤 YOUR COOKING PROFILE\")\n",
    "print(\"=\"*60)\n",
    "print(response.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3: Research a Recipe & Save It\n",
    "\n",
    "Let's find a great vegetarian pasta recipe:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "============================================================\n",
      "🍝 RECIPE DISCOVERY\n",
      "============================================================\n",
      "Perfect! I found an amazing recipe for you! 🍝✨\n",
      "\n",
      "## **Tomato Penne with Avocado** \n",
      "\n",
      "### Why I Chose This Recipe:\n",
      "This is an absolute winner that hits all your requirements! It's a gorgeous Italian-Mexican fusion pasta that combines the best of both worlds - your love for Italian cuisine with exciting Mexican spices. Here's what makes it perfect:\n",
      "\n",
      "**✅ Perfectly Fits Your Profile:**\n",
      "- **100% Vegetarian** - no meat, fish, or poultry\n",
      "- **Completely lactose-free** - naturally dairy-free with no cheese required!\n",
      "- **No shellfish** - completely safe for your allergy\n",
      "- **Quick cooking** - Ready in just 25 minutes (well under your 30-minute preference)\n",
      "- **Intermediate skill level** - matches your cooking abilities perfectly\n",
      "\n",
      "**🌟 What Makes It Special:**\n",
      "This dish is absolutely stunning! Picture tender wholemeal penne tossed in a vibrant, mildly spiced tomato sauce studded with golden caramelized onions, sweet orange peppers, and bright yellow sweetcorn. The whole thing is crowned with chunks of creamy avocado dressed in zesty lime - giving you all that rich, indulgent texture without any dairy!\n",
      "\n",
      "The Mexican spices (cumin, coriander, mild chilli) add warmth and depth without overwhelming heat, while fresh coriander and lime brighten everything up. It's comfort food that's also incredibly healthy - you get ALL FIVE of your daily vegetable servings in one gorgeous bowl!\n",
      "\n",
      "**📊 The Stats:**\n",
      "- **Cook Time:** 25 minutes total\n",
      "- **Difficulty:** Easy to Intermediate  \n",
      "- **Rating:** 4.3/5 stars (177 ratings)\n",
      "- **Nutrition:** Only 495 calories, packed with 18g of fiber, low fat, rich in iron and vitamin C\n",
      "\n",
      "**🎨 Key Ingredients:**\n",
      "Wholemeal penne, orange pepper, onion, garlic, chopped tomatoes, sweetcorn, avocado, lime, fresh coriander, and warming spices (chilli powder, cumin, ground coriander)\n",
      "\n",
      "This recipe is budget-friendly, uses mostly pantry staples, and the presentation is absolutely beautiful with all those vibrant colors. It's the perfect weeknight meal that tastes like you spent hours on it! 🥑🌶️🍅\n"
     ]
    }
   ],
   "source": [
    "response = client.chat.completions.create(\n",
    "    model=\"anthropic:claude-sonnet-4-5\",\n",
    "    messages=[{\n",
    "        \"role\": \"user\",\n",
    "        \"content\": \"\"\"Research a delicious vegetarian pasta recipe from:\n",
    "        - https://www.bbcgoodfood.com/recipes/collection/vegetarian-pasta-recipes\n",
    "        - https://www.allrecipes.com/search?q=vegetarian+pasta\n",
    "        \n",
    "        Then:\n",
    "        1. Make sure it fits my dietary profile (check memory!)\n",
    "        2. Save the recipe name and key ingredients in memory\n",
    "        3. Add notes about cook time and difficulty\n",
    "        4. Give me a brief summary with why you chose it\n",
    "\n",
    "        If you can't find any suitable recipe, let me know about your findings. Don't do more than 10 web fetches.\n",
    "        \n",
    "        Make it sound appetizing!\"\"\"\n",
    "    }],\n",
    "    tools=all_tools,\n",
    "    max_turns=20\n",
    ")\n",
    "\n",
    "print(\"=\"*60)\n",
    "print(\"🍝 RECIPE DISCOVERY\")\n",
    "print(\"=\"*60)\n",
    "print(response.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 4: \"What Can I Make?\" - Ingredient-Based Search\n",
    "\n",
    "Got random ingredients? Let's find what you can cook:\n",
    "\n",
    "NOTE: We have not saved much recipes nor preferences, so you may not get an excellent suggestion! But, it will still serve the purpose of demonstrating tool usage, and can be easily extended to provide better suggestions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "============================================================\n",
      "🥘 INGREDIENT-BASED RECIPE\n",
      "============================================================\n",
      "# 🍛 **Thai Chickpea Coconut Curry** - Perfect for You Tonight!\n",
      "\n",
      "---\n",
      "\n",
      "## ✨ **Why I Chose This Recipe:**\n",
      "\n",
      "This is absolutely **IDEAL** for you! Here's why:\n",
      "- ✅ **Thai cuisine** - one of your favorites!\n",
      "- ✅ **Curry** - you specifically mentioned this as a favorite dish\n",
      "- ✅ **25 minutes total** - under your 30-minute preference\n",
      "- ✅ **100% vegetarian & vegan** - naturally dairy-free (no lactose issues!)\n",
      "- ✅ **You have EVERY ingredient** already in your kitchen!\n",
      "- ✅ **Intermediate skill level** - perfect for your abilities\n",
      "- ✅ **One-pot meal** - easy cleanup!\n",
      "\n",
      "---\n",
      "\n",
      "## 📝 **Simple Step-by-Step Instructions:**\n",
      "\n",
      "### **Step 1: Start Your Rice** (5 mins)\n",
      "- Cook your rice according to package directions. This will be ready when your curry is done!\n",
      "\n",
      "### **Step 2: Build Your Flavor Base** (5 mins)\n",
      "- Heat a little oil in a large pan over medium heat\n",
      "- Add diced onion and sauté until soft and translucent (about 5 minutes)\n",
      "\n",
      "### **Step 3: Add Aromatics** (1-2 mins)\n",
      "- Stir in minced garlic and ginger\n",
      "- Cook for 1 minute until fragrant (your kitchen will smell amazing!)\n",
      "\n",
      "### **Step 4: Toast Your Spices** (1 min)\n",
      "- Add your spices: curry powder, cumin, turmeric, and coriander (about 1-2 tsp each)\n",
      "- Stir for about 1 minute to bloom the flavors\n",
      "\n",
      "### **Step 5: Add Tomatoes** (3 mins)\n",
      "- Toss in diced tomatoes\n",
      "- Cook until they start to soften and break down\n",
      "\n",
      "### **Step 6: Make It Creamy** (10 mins)\n",
      "- Pour in the entire can of coconut milk\n",
      "- Add drained chickpeas\n",
      "- Give it a good stir and let it simmer for 10 minutes until the sauce thickens nicely\n",
      "\n",
      "### **Step 7: Season & Serve!**\n",
      "- Taste and add salt and pepper as needed\n",
      "- Serve over your fluffy rice\n",
      "- *Optional garnish*: fresh cilantro if you have it, or a squeeze of lime for extra zing!\n",
      "\n",
      "---\n",
      "\n",
      "## 💪 **You've Got This!**\n",
      "\n",
      "This recipe is **foolproof** and incredibly forgiving. The coconut milk makes everything creamy and rich, the chickpeas add protein and heartiness, and those aromatics (garlic, ginger, onion) create layers of flavor that taste like you spent hours cooking!\n",
      "\n",
      "Plus, this gets even **better the next day**, so if you make extra, you'll have an amazing lunch tomorrow. The best part? It's all pantry staples, so you're making restaurant-quality Thai food without a trip to the store!\n",
      "\n",
      "**Enjoy your delicious, aromatic curry! You're going to love how this turns out!** 🌟\n"
     ]
    }
   ],
   "source": [
    "response = client.chat.completions.create(\n",
    "    model=\"anthropic:claude-sonnet-4-5\",\n",
    "    messages=[{\n",
    "        \"role\": \"user\",\n",
    "        \"content\": \"\"\"I have these ingredients in my kitchen:\n",
    "        - Chickpeas (canned)\n",
    "        - Coconut milk\n",
    "        - Tomatoes\n",
    "        - Onions, garlic, ginger\n",
    "        - Rice\n",
    "        - Various spices\n",
    "        \n",
    "        Based on my dietary profile and what I have:\n",
    "        1. Suggest a recipe I can make\n",
    "        2. Check if it matches my preferences (Thai/Italian, quick, vegetarian)\n",
    "        3. Save this recipe idea to memory\n",
    "        \n",
    "        As the final response, give me a simple step-by-step overview of how to make it, and why you chose this for me!\n",
    "        \n",
    "        Be encouraging and practical!\"\"\"\n",
    "    }],\n",
    "    tools=all_tools,\n",
    "    max_turns=10\n",
    ")\n",
    "\n",
    "print(\"=\"*60)\n",
    "print(\"🥘 INGREDIENT-BASED RECIPE\")\n",
    "print(\"=\"*60)\n",
    "print(response.choices[0].message.content)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cleanup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fetch_mcp.close()\n",
    "memory_mcp.close()\n",
    "print(\"✓ Servers closed - your recipes are saved!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Recap of what we did above\n",
    "\n",
    "Behind the scenes, aisuite did some magic:\n",
    "- ✅ **Converted MCP tool schemas** to OpenAI-compatible format\n",
    "- ✅ **Handled tool execution** when the LLM requested them\n",
    "- ✅ **Managed async operations** for MCP server communication\n",
    "\n",
    "MCP Tools\n",
    "**Web search** - LLM could do web search due to Fetch being passed as a tool.\n",
    "**Preserved your data in knowledge graph** - LLM could store your preferences and look it using server-memory being passed as a tool.\n",
    "\n",
    "You, as an user, just wrote natural prompts - aisuite handled all the tool calling complexity - LLM returned personalized recommendations.\n",
    "\n",
    "You built a **personal chef assistant** that:\n",
    "- ✅ Researches recipes tailored to your diet\n",
    "- ✅ Remembers your restrictions and preferences\n",
    "- ✅ Suggests recipes based on ingredients you have\n",
    "- ✅ Saves your favorite recipes and cooking notes\n",
    "- ✅ Provides personalized cooking advice\n",
    "\n",
    "**All with minimal code!**\n",
    "\n",
    "## Try These Next\n",
    "\n",
    "Now that you've got the basics, explore more capabilities:\n",
    "\n",
    "### 📦 Meal Prep Planning\n",
    "```python\n",
    "response = client.chat.completions.create(\n",
    "    model=\"anthropic:claude-sonnet-4-5\",\n",
    "    messages=[{\"role\": \"user\", \"content\": \"\"\"I want to meal prep for the week. Based on my profile:\n",
    "        \n",
    "        1. Suggest 2 vegetarian recipes that:\n",
    "           - Reheat well\n",
    "           - Stay fresh for 3-4 days\n",
    "           - Match my taste (Italian/Thai)\n",
    "           - Are filling and nutritious\n",
    "        \n",
    "        2. Save both recipes to memory as 'meal prep favorites'\n",
    "        3. Give me storage tips for each\"\"\"}],\n",
    "    tools=all_tools,\n",
    "    max_turns=8\n",
    ")\n",
    "```\n",
    "\n",
    "### 📚 Browse Your Recipe Collection\n",
    "```python\n",
    "response = client.chat.completions.create(\n",
    "    model=\"anthropic:claude-sonnet-4-5\",\n",
    "    messages=[{\"role\": \"user\", \"content\": \"\"\"Search your memory and tell me:\n",
    "        \n",
    "        1. What recipes have I saved?\n",
    "        2. What are my dietary restrictions and preferences?\n",
    "        3. Which recipes are best for meal prep?\n",
    "        4. Suggest what I should cook tonight based on my saved recipes\"\"\"}],\n",
    "    tools=memory_mcp.get_callable_tools(),\n",
    "    max_turns=5\n",
    ")\n",
    "```\n",
    "\n",
    "### 💡 Cooking Tips & Substitutions\n",
    "```python\n",
    "response = client.chat.completions.create(\n",
    "    model=\"anthropic:claude-sonnet-4-5\",\n",
    "    messages=[{\"role\": \"user\", \"content\": \"\"\"I want to make a recipe that calls for:\n",
    "        - Heavy cream (but I'm lactose intolerant!)\n",
    "        - Parmesan cheese\n",
    "        \n",
    "        1. Suggest dairy-free substitutions\n",
    "        2. Store these substitution tips in memory\n",
    "        3. Any other dairy-free tips for Italian cooking?\"\"\"}],\n",
    "    tools=all_tools,\n",
    "    max_turns=6\n",
    ")\n",
    "```\n",
    "\n",
    "### 🔍 Explore Your Recipe Memory\n",
    "```python\n",
    "# See the raw knowledge graph\n",
    "import json\n",
    "with open(memory_file, 'r') as f:\n",
    "    for line in f.readlines()[:10]:\n",
    "        entry = json.loads(line)\n",
    "        if 'recipe' in entry.get('name', '').lower():\n",
    "            print(f\"🍽️ {entry.get('name')}\")\n",
    "```\n",
    "\n",
    "### 🌟 More Fun Queries\n",
    "- \"Find me a healthy salad for lunch\"\n",
    "- \"I want to try baking - suggest a beginner dessert\"\n",
    "- \"Research authentic Thai curry recipes from https://www.bbcgoodfood.com/recipes/collection/thai-curry-recipes\"\n",
    "- \"Plan a dinner party menu for 6 people\"\n",
    "- \"What cooking techniques should I learn next?\"\n",
    "- \"Create a grocery list for this week's meal prep\"\n",
    "\n",
    "## The Pattern\n",
    "\n",
    "Setup MCP tools, and call chat.completions.create() with max_turns.\n",
    "\n",
    "```python\n",
    "# 1. Set up fetch + memory\n",
    "fetch_mcp = MCPClient(command=\"uvx\", args=[\"mcp-server-fetch\"])\n",
    "memory_mcp = MCPClient(\n",
    "    command=\"npx\",\n",
    "    args=[\"-y\", \"@modelcontextprotocol/server-memory\"],\n",
    "    env={\"MEMORY_FILE_PATH\": \"recipe_memory.jsonl\"}\n",
    ")\n",
    "\n",
    "# 2. Combine tools\n",
    "tools = fetch_mcp.get_callable_tools() + memory_mcp.get_callable_tools()\n",
    "\n",
    "# 3. Cook with AI!\n",
    "response = client.chat.completions.create(\n",
    "    model=\"openai:gpt-4o\",\n",
    "    messages=[{\"role\": \"user\", \"content\": \"Find a recipe and remember it\"}],\n",
    "    tools=tools,\n",
    "    max_turns=5\n",
    ")\n",
    "```\n",
    "\n",
    "## Advanced Ideas\n",
    "\n",
    "Extend this assistant to:\n",
    "- 📊 Track nutritional goals and suggest balanced meals\n",
    "- 🛒 Generate smart grocery lists with budget tracking\n",
    "- 📅 Plan weekly menus automatically\n",
    "- 👨‍🍳 Learn and improve from your cooking feedback\n",
    "- 🌍 Explore cuisines from different cultures\n",
    "- 📸 Store photos of your dishes (with filesystem MCP)\n",
    "- ⏰ Set cooking timers and reminders\n",
    "\n",
    "## Other Assistants to Build\n",
    "\n",
    "Use the same pattern for:\n",
    "- 🎬 **Movie recommendations** (see `movie_buff_assistant.ipynb`)\n",
    "- ✈️ **Travel planning** that remembers your bucket list\n",
    "- 📚 **Reading tracker** that knows your taste in books\n",
    "- 🏋️ **Fitness coach** that tracks your progress\n",
    "- 🌱 **Garden planner** that remembers what you planted\n",
    "\n",
    "## Resources\n",
    "\n",
    "- **Fetch Server**: https://github.com/modelcontextprotocol/servers/tree/main/src/fetch\n",
    "- **Memory Server**: https://github.com/modelcontextprotocol/servers/tree/main/src/memory\n",
    "- **aisuite Documentation**: https://github.com/andrewyng/aisuite\n",
    "- **More MCP Servers**: https://github.com/modelcontextprotocol/servers\n",
    "\n",
    "**Happy cooking! Your recipes and preferences persist forever!** 🍳✨"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
